package com.alangyun.remind.repository.algorithm;

import com.alangyun.remind.repository.data.EmployeeCaution;
import com.alangyun.remind.repository.data.EmployeeDataset;
import com.alangyun.remind.repository.data.NameTerm;
import com.alangyun.remind.repository.data.SixDimension;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class AlgorithmHelper {
	
	private static double precision(double value, int precision) {
		int pre = 1;
		if(precision>0) {
			for(int i=0; i<precision; i++)
				pre*=10;
		}
		
		return Math.round(value *pre) *1.0 / pre;
	}
	
	/**
	 * 专业经历(X1)
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:34:07
	 * @param yearDistance 目前所在专业岗位工作年限
	 * @return
	 */
	public static final double calcX1(double yearDistance) {
		return precision(0.25 * yearDistance, 5);
	}

	/**
	 * 学业经历(X2)
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:33:42
	 * @param minEdu     初始学历
	 * @param highestEdu 最高学历
	 * @return
	 */
	public static final double calcX2(Education minEdu, Education highestEdu) {
		double ret = 0.0;
		if (minEdu == null) {
			ret= highestEdu == null ? 0.0 : highestEdu.standard();
		}else {
			ret= minEdu.standard() * 0.6 + (highestEdu == null ? 0.0 : highestEdu.standard()) * 0.4;
		}
		return precision(ret, 5);
	}

	/**
	 * 任职资格(X3)
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:32:48
	 * @param prof           职称等级枚举
	 * @param skill          技能等级枚举
	 * @param cert           资格证书类型枚举（注册类/其他）
	 * @param ownProduceCert 是否有生产作业执业资格证书
	 * @param cd             岗位类别因子
	 * @return
	 */
	public static final double calcX3(ProfessionalLevel prof, SkillLevel skill, SocialCert cert, boolean ownProduceCert,
			TopJobTypeEnum cd) {
		double fp = 0/** 职称因子 */, ft = 0/** 技术类因子 */, fz = 0/** 资格证书因子 */;
		switch (cd) {
		case SALE:
		case LEAD:
			fp=0.6;
			ft=0.1;
			fz=0.6;
			break;
		case TECH:
			fp = 0.4;
			ft = 0.4;
			fz = 0.4;
			break;
		case SKILL:
		case SERVICE:
			fp = 0.1;
			ft = 0.6;
			fz = 0.1;
			break;
		case DEFAULT:
			fp = 0;
			ft = 0;
			fz = 0;
			break;
		}

		double ret = 0;
		if (prof != null)
			ret += prof.standard() * fp;
		if (skill != null)
			ret += skill.standard() * ft;
		if (cert != null)
			ret += cert.standard() * fz;
		if (ownProduceCert)
			ret += 1 * fz;

		return precision(ret, 5);
	}

	/**
	 * 绩效表现
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:31:45
	 * @param perform  三年绩效得分总分标准分
	 * @param vote     三年民主测评情况
	 * @param isJoin   工作表现情况
	 * @param isLeader 是否为领导
	 * @return
	 */
	public static final double calcX4(Perfomance perform, VoteLevel vote, boolean isJoin, boolean isLeader) {
		double ret = 0;
		if (isLeader) {
			if (perform != null)
				ret += perform.standard() * 0.5;
			if (vote != null)
				ret += vote.standard() * 0.5;

			return ret;
		}

		if (perform != null)
			ret += perform.standard() * 0.8;
		if (isJoin)
			ret += 1 * 0.2;

		return precision(ret,5);
	}

	/**
	 * 专业成果
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:30:21
	 * @param gy 国家级(研究成果数）
	 * @param sy 国网公司（省部）级(研究成果数）
	 * @param dy 省公司（市）级(研究成果数）
	 * @param gj 国家级（同级竞赛数）
	 * @param sj 国网公司（省部）级（同级竞赛数）
	 * @param dj 省公司（市）级（同级竞赛数）
	 * @return
	 */
	public static final double calcX5(int gy, int sy, int dy, int gj, int sj, int dj) {
		double ret= 0.5 * (gy + (gj / 2)) + 0.2 * (sy + (sj / 2)) + 0.1 * (dy + (dj / 2));
		return precision(ret, 5);
	}

	/**
	 * 专业化能力
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:29:47
	 * @param ybnl   一般能力
	 * @param srl    胜任力
	 * @param zyzsjn 专业知识和技能
	 * @return 分级赋分（高、中、低）
	 */
	public static final double calcX6(double ybnl, double srl, double zyzsjn) {
		double ret= ybnl * 0.2 + srl * 0.4 + zyzsjn * 0.4;
		return precision(ret, 5);
	}

	/**
	 * 管理经历
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:29:17
	 * @param bznx  从事部门、班组、站所负责人经历年限
	 * @param kdwcs 跨单位交流次数
	 * @param dwnx  从事党务工作主要负责人（书记）经历年限
	 * @return
	 */
	public static final double calcX7(int bznx, int kdwcs, int dwnx) {
		double ret= bznx * 0.25 + kdwcs * 0.25 + dwnx * 0.25;
		return precision(ret, 5);
	}

	/**
	 * 创新创效
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午8:32:43
	 * @param g    是否国家级
	 * @param gdy  是否国家级第一名
	 * @param s    是否国网公司级
	 * @param sdy  是否国网公司级第一名
	 * @param d    是否省公司级
	 * @param ddy  是否省公司级第一名
	 * @param sh   是否地市公司级
	 * @param shdy 是否地市级第一名
	 * @param x    是否县公司级
	 * @param xds  是否县公司级前三名
	 * @return
	 */
	public static final double calcX8(boolean g, boolean gdy, boolean s, boolean sdy, boolean d, boolean ddy,
			boolean sh, boolean shdy, boolean x, boolean xds) {
		double ret = 0;
		if (g)
			ret += 2;
		if (s)
			ret += 1;
		if (d)
			ret += 0.5;
		if (sh)
			ret += 0.1;
		if (gdy || sdy || ddy || shdy)
			ret += 1.1;
		if (xds)
			ret += 0.1;

		return precision(ret,5);
	}

	/**
	 * 三年岗位竞聘频次
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午8:35:17
	 * @param times 三年岗位竞聘次数
	 * @return
	 */
	public static final double calcX9(int times) {
		return times * 0.1;
	}

	/**
	 * 三年荣誉情况
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:29:03
	 * @param g   综合类国家级
	 * @param s   综合类国网公司（省部）级
	 * @param d   综合类省公司（市）级
	 * @param sh  综合类地市公司（县）级
	 * @param x   专业类县公司级
	 * @param zg  专业类国家级
	 * @param zs  专业类国网公司（省部）级
	 * @param zd  专业类省公司（市）级
	 * @param zsh 专业类地市公司（县）级
	 * @param zx  专业类县公司级
	 * @return
	 */
	public static final double calcX10(int g, int s, int d, int sh, int x, int zg, int zs, int zd, int zsh, int zx) {
		return precision(g + s * 0.8 + d * 0.5 + sh * 0.1 + x * 0.05 + 
				zg * 0.8 + s * 0.5 + d * 0.1 + zsh * 0.05 + zx * 0.025,5);
	}

	/**
	 * 人才称号
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:28:09
	 * @param g  国家级
	 * @param s  国网公司（省部）级
	 * @param d  省公司（市）级
	 * @param sh 地市公司（县）级
	 * @param x  县公司级
	 * @return
	 */
	public static final double calcX11(boolean g, boolean s, boolean d, boolean sh, boolean x) {
		return precision((g ? 3 : 0) + (s ? 2 : 0) * 0.8 + (d ? 1 : 0) * 0.1 + (sh ? 0.5 : 0) * 0.05 + (x ? 0.1 : 0) * 0.01, 5);
	}

	/**
	 * 三年工作差错频次
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年11月23日 下午8:27:48
	 * @param times 近三年工作差错频次（减分项）
	 * @return
	 */
	public static final double calcX12(double times) {
		return times * 0.01;
	}

	/**
	 * 求解专业性（Z）
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午9:31:41
	 * @param x1
	 * @param x2
	 * @param x3
	 * @param x4
	 * @param x5
	 * @param x8
	 * @param k  K因子
	 * @param cd C(/D)因子
	 * @return
	 */
	public static final double calcZ(double x1, double x2, double x3, double x4, double x5, double x8, FacterK k,
			TopJobTypeEnum cd) {
		double ret = (x1 * k.value() + x2 * k.value() + x3 + x5) * x4;
		ret = ret * cd.getC() + x8 * cd.getD();

		return precision(ret,5);
	}

	/**
	 * 求解创效性（C）
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午9:32:21
	 * @param x4
	 * @param x5
	 * @param x8
	 * @return
	 */
	public static final double calcC(double x4, double x5, double x8) {
		return precision(((x5 + x8) * 0.7) + (x4 * 0.3), 5);
	}

	/**
	 * 求解可塑性（P）
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午9:32:45
	 * @param x2
	 * @param x4
	 * @param x6
	 * @return
	 */
	public static final double calcP(double x2, double x4, double x6) {
		return precision(((x2 + x6) * 0.5) + (x4 * 0.5), 5);
	}

	/**
	 * 求解稳定性（W）
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午9:33:00
	 * @param x9
	 * @param e  E因子
	 * @return
	 */
	public static final double calcW(double x9, double e) {
		double ret= e - x9;
		return ret<0?0:precision(ret, 5);
	}

	/**
	 * 求解相容性（X）
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午9:33:21
	 * @param x9
	 * @param x10
	 * @param x11
	 * @param x12
	 * @return
	 */
	public static final double calcX(double x9, double x10, double x11, double x12) {
		double ret= x10 + x11 - x9 - x12;
		return ret<0?0:precision(ret,5);
	}

	/**
	 * 求解适应性（S）
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午9:33:40
	 * @param x9
	 * @param x12
	 * @param e   E因子
	 * @param f   F因子
	 * @return
	 */
	public static final double calcS(double x9, double x12, double e, double f) {
		double ret= e + f - x9 - x12;
		return ret<0?0:precision(ret, 5);
	}

	/**
	 * 求解sin值，求适配概率
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月11日 下午9:47:06
	 * @param v
	 */
	public static final void calcSinValue(SixDimension v) {
		v.setSinValue((v.getZ() * v.getC() + v.getC() * v.getP() + v.getP() * v.getW() + v.getW() * v.getX()
				+ v.getX() * v.getS() + v.getS() * v.getZ()) * 0.8660254);
	}
	

	/**
	 * 求解个人的X1~X12和Z、C、W、P、X、S的值
	 *
	 * @author hoobort klxukun@126.com
	 * @company 北京诚朗信息技术有限公司
	 * @datetime 2022年12月14日 上午9:28:59
	 * @param data
	 */
	public static void calcXOfUser(EmployeeCaution data) {
		//求X1
		data.setX1(AlgorithmHelper.calcX1(data.getZygwgznx()));
		//求X2
		data.setX2(AlgorithmHelper.calcX2(//
				null, //
				Education.keyOf(data.getHighEdu())//
				));
		//求X3
		TopJobTypeEnum cd = TopJobTypeEnum.keyOf(data.getJob01Name());
		data.setX3(AlgorithmHelper.calcX3(//
				ProfessionalLevel.keyOf(data.getTechLevelName()),//
				SkillLevel.keyOf(data.getSkillName()),//
				SocialCert.keyOf(data.getShtkzgzs()),//
				data.getSczyzgzs()!=null, //
				cd//
				));
		//求X4
		double val=AlgorithmHelper.calcX4(Perfomance.keyOf(data.getSnjxzf()),
				VoteLevel.keyOf(data.getSnmzcpqk()),
				data.getGzbxqk()!=null,false);
		if(val>=7)
			data.setZyhnl("高");
		else if(val>=5)
			data.setZyhnl("中");
		else
			data.setZyhnl("低");
		data.setX4(val);
		//求X5
		data.setX5(AlgorithmHelper.calcX5(//
				data.getYjcgsgjj(),//
				data.getYjcgssbj(),//
				data.getYjcgsdsj(), //
				data.getTjjspcgjj(),//
				data.getTjjspcsbj(),//
				data.getTjjspcdsj()//
				));
		//求X6
		data.setX6(AlgorithmHelper.calcX6(data.getYbnl(), data.getSrl(), data.getZyzsjn()));
		//求X7
		data.setX7(AlgorithmHelper.calcX7(//
				data.getFzrnx(), //
				data.getKdwjlcs(), //
				data.getDwgzfzrnx()//
				));
		//求X8
		data.setX8(AlgorithmHelper.calcX8(//
				data.getCxcxgjj(), //
				data.getCxcxgjjdym(), //
				data.getCxcxsbj(), //
				data.getCxcxsbjdym(), //
				data.getCxcxdsj(), //
				data.getCxcxdsjdym(),//
				data.getCxcxxj(),//
				data.getCxcxxjdym(),//
				data.getCxcxxzj(), //
				data.getCxcxxzjdym()));//
		//求X9
		data.setX9(AlgorithmHelper.calcX9(data.getJsngwjppc()));
		//求X10
		data.setX10(AlgorithmHelper.calcX10(
				data.getZhlbzgjj(),//
				data.getZhlbzsbj(),//
				data.getZhlbzdsj(),//
				data.getZhlbzxj(),//
				data.getZhlbzzj(),//
				data.getZylbzgjj(),//
				data.getZylbzsbj(),//
				data.getZylbzdsj(),//
				data.getZylbzxj(),//
				data.getZylbzzj()//
				));
		//求X11
		data.setX11(AlgorithmHelper.calcX11(
				data.getRcchgjj(),//
				data.getRcchsbj(),//
				data.getRcchdsj(),//
				data.getRcchxj(),//
				data.getRcchzj()//
				));
		//求X12
		data.setX12(AlgorithmHelper.calcX12(data.getJsngzccpc()));
		

		//求Z - 专业性
		data.setZ(AlgorithmHelper.calcZ(data.getX1(), data.getX2(), data.getX3(), data.getX4(),
				data.getX5(), data.getX8(), FacterK.SAME, cd));
		//求C - 创效性
		data.setC(AlgorithmHelper.calcC(data.getX4(), data.getX5(), data.getX8()));
		//求P - 可塑性
		data.setP(AlgorithmHelper.calcP(data.getX2(), data.getX4(), data.getX6()));
		//求W - 稳定性
		data.setW(AlgorithmHelper.calcW(data.getX9(), AlgorithmHelper.E));
		//求X - 相容性
		data.setX(AlgorithmHelper.calcX(data.getX9(), data.getX10(), data.getX11(), data.getX12()));
		//求S - 适应性
		data.setS(AlgorithmHelper.calcS(data.getX9(), data.getX12(), AlgorithmHelper.E, AlgorithmHelper.F));
	}
	
	public static void calcSixStandardOfUser(EmployeeDataset dataset) {
		if(dataset==null||dataset.getDatas().size()==0)
			return;
		
		double x1=0,x2=0,x3=0,x4=0,x5=0,x6=0,x7=0,x8=0,x9=0,x10=0,x11=0,x12=0;
		
		int total = 0;
		for(EmployeeCaution u: dataset.getDatas()) {
			Perfomance perf=Perfomance.keyOf(u.getSnjxzf());
			if(perf.getSelfVal()>=5.5) {
				x1+=u.getX1();
				x2+=u.getX2();
				x3+=u.getX3();
				x4+=u.getX4();
				x5+=u.getX5();
				x6+=u.getX6();
				x7+=u.getX7();
				x8+=u.getX8();
				x9+=u.getX9();
				x10+=u.getX10();
				x11+=u.getX11();
				x12+=u.getX12();
				total++;
			}
		}
		if(total==0)
			total =1;
		x1=x1/total;
		x2=x2/total;
		x3=x3/total;
		x4=x4/total;
		x5=x5/total;
		x6=x6/total;
		x7=x7/total;
		x8=x8/total;
		x9=x9/total;
		x10=x10/total;
		x11=x11/total;
		x12=x12/total;
		
		
		
		EmployeeCaution standard= new EmployeeCaution();
		standard.setX1(x1);
		standard.setX2(x2);
		standard.setX3(x3);
		standard.setX4(x4);
		standard.setX5(x5);
		standard.setX6(x6);
		standard.setX7(x7);
		standard.setX8(x8);
		standard.setX9(x9);
		standard.setX10(x10);
		standard.setX11(x11);
		standard.setX12(x12);

		standard.setX(AlgorithmHelper.calcX(x9, x10, x11, x12));		
		standard.setC(AlgorithmHelper.calcC(x4, x5, x8));		
		standard.setW(AlgorithmHelper.calcW(x9, AlgorithmHelper.E));		
		standard.setZ(AlgorithmHelper.calcZ(x1, x2, x3, x4, x5, x8, FacterK.SAME, TopJobTypeEnum.DEFAULT));		
		standard.setP(AlgorithmHelper.calcP(x2, x4, x6));		
		standard.setS(AlgorithmHelper.calcS(x9, x12, AlgorithmHelper.E, AlgorithmHelper.F));
		
		dataset.setStandardUser(standard);
		AlgorithmHelper.calcSinValue(standard);

		EmployeeCaution spec= new EmployeeCaution();
		spec.setX1(x1);
		spec.setX2(x2);
		spec.setX3(x3);
		spec.setX4(x4);
		spec.setX5(x5);
		spec.setX6(x6);
		spec.setX7(x7);
		spec.setX8(x8);
		spec.setX9(x9);
		spec.setX10(x10);
		spec.setX11(x11);
		spec.setX12(x12);

		spec.setX(standard.getX());		
		spec.setC(standard.getC());		
		spec.setW(standard.getW());		
		spec.setZ(standard.getZ());		
		spec.setP(standard.getP());		
		spec.setS(standard.getS());
		spec.setSinValue(standard.getSinValue());
		
		dataset.setSpecialUser(spec);
	}

	// 选定组织获取组织中的员工信息并计算每类数据的平均值
	public static EmployeeCaution getStandardCaution(List<Integer> team, List<Integer> job, EmployeeDataset data) {
		List<EmployeeCaution> datas = data.getDatas();
		List<EmployeeCaution> standards = new ArrayList<>();
		List<Integer> l1TeamIds = new ArrayList<>();
		List<Integer> l2TeamIds = new ArrayList<>();
		List<Integer> l3TeamIds = new ArrayList<>();
		List<Integer> l1JobIds = new ArrayList<>();
		List<Integer> l2JobIds = new ArrayList<>();
		List<NameTerm> l1teams = data.getTeams();  //从数据库获取teams信息
		if(!l1teams.isEmpty()){
			for(NameTerm l1TeamObj : l1teams) {
				int l1teamId = l1TeamObj.getId();
				if(team.contains(l1teamId)){
					l1TeamIds.add(l1teamId);  // 将与参数匹配的1级team id存入list
				}
				List<NameTerm> l2Teams = l1TeamObj.getNodes();
				if(!l2Teams.isEmpty()){
					for(NameTerm l2TeamObj : l2Teams) {
						int l2teamId = l2TeamObj.getId();
						if(team.contains(l2teamId)){
							l2TeamIds.add(l2teamId);  // 将与参数匹配的2级team id存入list
						}
						List<NameTerm> l3Teams = l2TeamObj.getNodes();
						if(!l3Teams.isEmpty()){
							for(NameTerm l3TeamObj : l3Teams) {
								int l3teamId = l3TeamObj.getId();
								if(team.contains(l3teamId)){
									l3TeamIds.add(l3teamId);  // 将与参数匹配的3级team id存入list
								}
							}
						}
					}
				}
			}
		}
		List<NameTerm> l1Jobs = data.getJobs();  //从数据库获取jobs信息
		if(!l1Jobs.isEmpty()){
			for(NameTerm l1JobObj : l1Jobs) {
				int l1jobId = l1JobObj.getId();
				if(job.contains(l1jobId)){
					l1JobIds.add(l1jobId);  // 将与参数匹配的1级job id存入list
				}
				List<NameTerm> l2Jobs = l1JobObj.getNodes();
				if(!l2Jobs.isEmpty()){
					for(NameTerm l2JobObj : l2Jobs) {
						int l2jobId = l2JobObj.getId();
						if(job.contains(l2jobId)){
							l2JobIds.add(l2jobId);  // 将与参数匹配的2级job id存入list
						}
					}
				}
			}
		}

		for(EmployeeCaution u: datas) {
			Integer unit = u.getUnit();
			Integer depart = u.getDepart();
			Integer classOrGroup = u.getClassOrGroup();
			Integer job01 = u.getJob01();
			Integer job02 = u.getJob02();

			if(!l2JobIds.isEmpty()){  // job2非空
				if(l2JobIds.contains(job02)) {
                    standards.add(u);
                }
            } else if(!l1JobIds.isEmpty()){
                if(l1JobIds.contains(job01)) {
                    standards.add(u);
                }
            } else if(!l3TeamIds.isEmpty()){
                if(l3TeamIds.contains(classOrGroup)) {
                    standards.add(u);
                }
			} else if(!l2TeamIds.isEmpty()){
                if(l2TeamIds.contains(depart)) {
                    standards.add(u);
                }
            } else if(!l1TeamIds.isEmpty()){
                if(l1TeamIds.contains(unit)) {
                    standards.add(u);
                }
            }
		}

		double x1s=0,x2s=0,x3s=0,x4s=0,x5s=0,x6s=0,x7s=0,x8s=0,x9s=0,x10s=0,x11s=0,x12s=0,zs=0,cs=0,ps=0,ws=0,xs=0,ss=0,sins=0;
		for(EmployeeCaution u: standards) {
			x1s += u.getX1();
			x2s += u.getX2();
			x3s += u.getX3();
			x4s += u.getX4();
			x5s += u.getX5();
			x6s += u.getX6();
			x7s += u.getX7();
			x8s += u.getX8();
			x9s += u.getX9();
			x10s += u.getX10();
			x11s += u.getX11();
			x12s += u.getX12();
			zs += u.getZ();
			cs += u.getC();
			ps += u.getP();
			ws += u.getW();
			xs += u.getX();
			ss += u.getS();
			sins += u.getSinValue();
		}
		EmployeeCaution standardCaution = new EmployeeCaution();
		standardCaution.setX1(x1s/standards.size());
		standardCaution.setX2(x2s/standards.size());
		standardCaution.setX3(x3s/standards.size());
		standardCaution.setX4(x4s/standards.size());
		standardCaution.setX5(x5s/standards.size());
		standardCaution.setX6(x6s/standards.size());
		standardCaution.setX7(x7s/standards.size());
		standardCaution.setX8(x8s/standards.size());
		standardCaution.setX9(x9s/standards.size());
		standardCaution.setX10(x10s/standards.size());
		standardCaution.setX11(x11s/standards.size());
		standardCaution.setX12(x12s/standards.size());
		standardCaution.setZ(zs/standards.size());
		standardCaution.setC(cs/standards.size());
		standardCaution.setP(ps/standards.size());
		standardCaution.setW(ws/standards.size());
		standardCaution.setX(xs/standards.size());
		standardCaution.setS(ss/standards.size());
		standardCaution.setSinValue(sins/standards.size());
		return standardCaution;
	}

	/**
	 * K因子
	 *
	 * @company 北京诚朗信息技术有限公司
	 * @author hoobort klxukun@126.com
	 * @datetime 2022年12月11日 下午9:40:37
	 *
	 */
	public enum FacterK {
		SAME(1.0), // 相同专业
		RELATIVE(0.8), // 相关专业
		NONE(0.0);// 无关专业

		private double val;

		private FacterK(double val) {
			this.val = val;
		}

		public double value() {
			return this.val;
		}
	}

	public static final double E = 3.0;
	public static final double F = 3.0;
	
}
